| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349 | 1
1
4
1
1
1
1
6
2
1
1
1
1
1
1
1
1
1
4
4
4
4
4
4
4
4
4
4
4
4
4
1
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
1
1
1
1
1
1
1
| System.register(['aurelia-metadata', 'aurelia-binding', 'aurelia-task-queue', './view-strategy', './view-engine', './content-selector', './util', './bindable-property', './behavior-instance'], function (_export) {
'use strict';
var Origin, ObserverLocator, TaskQueue, ViewStrategy, ViewEngine, ContentSelector, hyphenate, BindableProperty, BehaviorInstance, defaultInstruction, contentSelectorFactoryOptions, hasShadowDOM, HtmlBehaviorResource;
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
return {
setters: [function (_aureliaMetadata) {
Origin = _aureliaMetadata.Origin;
}, function (_aureliaBinding) {
ObserverLocator = _aureliaBinding.ObserverLocator;
}, function (_aureliaTaskQueue) {
TaskQueue = _aureliaTaskQueue.TaskQueue;
}, function (_viewStrategy) {
ViewStrategy = _viewStrategy.ViewStrategy;
}, function (_viewEngine) {
ViewEngine = _viewEngine.ViewEngine;
}, function (_contentSelector) {
ContentSelector = _contentSelector.ContentSelector;
}, function (_util) {
hyphenate = _util.hyphenate;
}, function (_bindableProperty) {
BindableProperty = _bindableProperty.BindableProperty;
}, function (_behaviorInstance) {
BehaviorInstance = _behaviorInstance.BehaviorInstance;
}],
execute: function () {
defaultInstruction = { suppressBind: false };
contentSelectorFactoryOptions = { suppressBind: true };
hasShadowDOM = !!HTMLElement.prototype.createShadowRoot;
HtmlBehaviorResource = (function () {
function HtmlBehaviorResource() {
_classCallCheck(this, HtmlBehaviorResource);
this.elementName = null;
this.attributeName = null;
this.attributeDefaultBindingMode = undefined;
this.liftsContent = false;
this.targetShadowDOM = false;
this.skipContentProcessing = false;
this.usesShadowDOM = false;
this.childExpression = null;
this.hasDynamicOptions = false;
this.containerless = false;
this.properties = [];
this.attributes = {};
}
HtmlBehaviorResource.convention = function convention(name, existing) {
var behavior;
if (name.endsWith('CustomAttribute')) {
behavior = existing || new HtmlBehaviorResource();
behavior.attributeName = hyphenate(name.substring(0, name.length - 15));
}
if (name.endsWith('CustomElement')) {
behavior = existing || new HtmlBehaviorResource();
behavior.elementName = hyphenate(name.substring(0, name.length - 13));
}
return behavior;
};
HtmlBehaviorResource.prototype.analyze = function analyze(container, target) {
var proto = target.prototype,
properties = this.properties,
attributeName = this.attributeName,
attributeDefaultBindingMode = this.attributeDefaultBindingMode,
i,
ii,
current;
this.observerLocator = container.get(ObserverLocator);
this.taskQueue = container.get(TaskQueue);
this.target = target;
this.usesShadowDOM = this.targetShadowDOM && hasShadowDOM;
this.handlesCreated = 'created' in proto;
this.handlesBind = 'bind' in proto;
this.handlesUnbind = 'unbind' in proto;
this.handlesAttached = 'attached' in proto;
this.handlesDetached = 'detached' in proto;
this.apiName = (this.elementName || this.attributeName).replace(/-([a-z])/g, function (m, w) {
return w.toUpperCase();
});
Eif (attributeName !== null) {
Eif (properties.length === 0) {
//default for custom attributes
new BindableProperty({
name: 'value',
changeHandler: 'valueChanged' in proto ? 'valueChanged' : null,
attribute: attributeName,
defaultBindingMode: attributeDefaultBindingMode
}).registerWith(target, this);
}
current = properties[0];
Eif (properties.length === 1 && current.name === 'value') {
//default for custom attributes
current.isDynamic = current.hasOptions = this.hasDynamicOptions;
current.defineOn(target, this);
} else {
//custom attribute with options
for (i = 0, ii = properties.length; i < ii; ++i) {
properties[i].defineOn(target, this);
}
current = new BindableProperty({
name: 'value',
changeHandler: 'valueChanged' in proto ? 'valueChanged' : null,
attribute: attributeName,
defaultBindingMode: attributeDefaultBindingMode
});
current.hasOptions = true;
current.registerWith(target, this);
}
} else {
for (i = 0, ii = properties.length; i < ii; ++i) {
properties[i].defineOn(target, this);
}
}
};
HtmlBehaviorResource.prototype.load = function load(container, target, viewStrategy, transientView) {
var _this = this;
var options;
if (this.elementName !== null) {
viewStrategy = viewStrategy || this.viewStrategy || ViewStrategy.getDefault(target);
options = {
targetShadowDOM: this.targetShadowDOM,
beforeCompile: target.beforeCompile
};
if (!viewStrategy.moduleId) {
viewStrategy.moduleId = Origin.get(target).moduleId;
}
return viewStrategy.loadViewFactory(container.get(ViewEngine), options).then(function (viewFactory) {
if (!transientView) {
_this.viewFactory = viewFactory;
}
return viewFactory;
});
}
return Promise.resolve(this);
};
HtmlBehaviorResource.prototype.register = function register(registry, name) {
if (this.attributeName !== null) {
registry.registerAttribute(name || this.attributeName, this, this.attributeName);
}
if (this.elementName !== null) {
registry.registerElement(name || this.elementName, this);
}
};
HtmlBehaviorResource.prototype.compile = function compile(compiler, resources, node, instruction, parentNode) {
if (this.liftsContent) {
if (!instruction.viewFactory) {
var template = document.createElement('template'),
fragment = document.createDocumentFragment(),
part = node.getAttribute('part');
node.removeAttribute(instruction.originalAttrName);
if (node.parentNode) {
node.parentNode.replaceChild(template, node);
} else if (window.ShadowDOMPolyfill) {
//HACK: IE template element and shadow dom polyfills not quite right...
ShadowDOMPolyfill.unwrap(parentNode).replaceChild(ShadowDOMPolyfill.unwrap(template), ShadowDOMPolyfill.unwrap(node));
} else {
//HACK: same as above
parentNode.replaceChild(template, node);
}
fragment.appendChild(node);
instruction.viewFactory = compiler.compile(fragment, resources);
if (part) {
instruction.viewFactory.part = part;
node.removeAttribute('part');
}
node = template;
}
} else if (this.elementName !== null) {
//custom element
var partReplacements = {};
if (!this.skipContentProcessing && node.hasChildNodes()) {
if (!this.usesShadowDOM) {
var fragment = document.createDocumentFragment(),
currentChild = node.firstChild,
nextSibling;
while (currentChild) {
nextSibling = currentChild.nextSibling;
if (currentChild.tagName === 'TEMPLATE' && (toReplace = currentChild.getAttribute('replace-part'))) {
partReplacements[toReplace] = compiler.compile(currentChild, resources);
} else {
fragment.appendChild(currentChild);
}
currentChild = nextSibling;
}
instruction.contentFactory = compiler.compile(fragment, resources);
} else {
var currentChild = node.firstChild,
nextSibling,
toReplace;
while (currentChild) {
nextSibling = currentChild.nextSibling;
if (currentChild.tagName === 'TEMPLATE' && (toReplace = currentChild.getAttribute('replace-part'))) {
partReplacements[toReplace] = compiler.compile(currentChild, resources);
}
currentChild = nextSibling;
}
}
}
}
instruction.partReplacements = partReplacements;
instruction.suppressBind = true;
return node;
};
HtmlBehaviorResource.prototype.create = function create(container) {
var instruction = arguments[1] === undefined ? defaultInstruction : arguments[1];
var element = arguments[2] === undefined ? null : arguments[2];
var bindings = arguments[3] === undefined ? null : arguments[3];
var executionContext = instruction.executionContext || container.get(this.target),
behaviorInstance = new BehaviorInstance(this, executionContext, instruction),
viewFactory,
host;
if (this.liftsContent) {
//template controller
element.primaryBehavior = behaviorInstance;
} else if (this.elementName !== null) {
//custom element
viewFactory = instruction.viewFactory || this.viewFactory;
if (viewFactory) {
//TODO: apply element instructions? var results = viewFactory.applyElementInstructions(container, behaviorInstance.executionContext, element);
behaviorInstance.view = viewFactory.create(container, behaviorInstance.executionContext, instruction);
//TODO: register results with view
}
if (element) {
element.primaryBehavior = behaviorInstance;
if (this.usesShadowDOM) {
host = element.createShadowRoot();
} else {
host = element;
}
if (behaviorInstance.view) {
if (!this.usesShadowDOM) {
if (instruction.contentFactory) {
var contentView = instruction.contentFactory.create(container, null, contentSelectorFactoryOptions);
ContentSelector.applySelectors(contentView, behaviorInstance.view.contentSelectors, function (contentSelector, group) {
return contentSelector.add(group);
});
behaviorInstance.contentView = contentView;
}
}
if (instruction.anchorIsContainer) {
if (this.childExpression) {
behaviorInstance.view.addBinding(this.childExpression.createBinding(host, behaviorInstance.executionContext));
}
behaviorInstance.view.appendNodesTo(host);
} else {
behaviorInstance.view.insertNodesBefore(host);
}
} else if (this.childExpression) {
bindings.push(this.childExpression.createBinding(element, behaviorInstance.executionContext));
}
} else if (behaviorInstance.view) {
//dynamic element with view
behaviorInstance.view.owner = behaviorInstance;
if (this.childExpression) {
behaviorInstance.view.addBinding(this.childExpression.createBinding(instruction.host, behaviorInstance.executionContext));
}
} else if (this.childExpression) {
//dynamic element without view
bindings.push(this.childExpression.createBinding(instruction.host, behaviorInstance.executionContext));
}
} else if (this.childExpression) {
//custom attribute
bindings.push(this.childExpression.createBinding(element, behaviorInstance.executionContext));
}
if (element && !(this.apiName in element)) {
element[this.apiName] = behaviorInstance.executionContext;
}
return behaviorInstance;
};
HtmlBehaviorResource.prototype.ensurePropertiesDefined = function ensurePropertiesDefined(instance, lookup) {
var properties, i, ii, observer;
if ('__propertiesDefined__' in lookup) {
return;
}
lookup.__propertiesDefined__ = true;
properties = this.properties;
for (i = 0, ii = properties.length; i < ii; ++i) {
observer = properties[i].createObserver(instance);
if (observer !== undefined) {
lookup[observer.propertyName] = observer;
}
}
};
return HtmlBehaviorResource;
})();
_export('HtmlBehaviorResource', HtmlBehaviorResource);
}
};
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL2h0bWwtYmVoYXZpb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O29JQVVJLGtCQUFrQixFQUNsQiw2QkFBNkIsRUFDN0IsWUFBWSxFQUVILG9CQUFvQjs7Ozs7O2dDQWR6QixNQUFNOzt3Q0FDTixlQUFlOztvQ0FDZixTQUFTOzttQ0FDVCxZQUFZOzsrQkFDWixVQUFVOzt5Q0FDVixlQUFlOzt3QkFDZixTQUFTOzsyQ0FDVCxnQkFBZ0I7OzJDQUNoQixnQkFBZ0I7OztBQUVwQix3QkFBa0IsR0FBRyxFQUFFLFlBQVksRUFBQyxLQUFLLEVBQUU7QUFDM0MsbUNBQTZCLEdBQUcsRUFBRSxZQUFZLEVBQUMsSUFBSSxFQUFFO0FBQ3JELGtCQUFZLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCOztBQUU5QywwQkFBb0I7QUFDcEIsaUJBREEsb0JBQW9CLEdBQ2xCO2dDQURGLG9CQUFvQjs7QUFFN0IsY0FBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDeEIsY0FBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDMUIsY0FBSSxDQUFDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQztBQUM3QyxjQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUMxQixjQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUM3QixjQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0FBQ25DLGNBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBQzNCLGNBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQzVCLGNBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDL0IsY0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDM0IsY0FBSSxDQUFDLFVB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dkMsY0FBSSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUM7O0FBRWhDLGNBQUcsdUJBQXVCLElBQUksTUFBTSxFQUFDO0FBQ25DLG1CQUFPO1dBQ1I7O0FBRUQsZ0JBQU0sQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFDcEMsb0JBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDOztBQUU3QixlQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQztBQUM3QyxvQkFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRWxELGdCQUFHLFFBQVEsS0FBSyxTQUFTLEVBQUM7QUFDeEIsb0JBQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQzFDO1dBQ0Y7U0FDRjs7ZUFwU1Usb0JBQW9COzs7c0NBQXBCLG9CQUFvQiIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS90ZW1wbGF0aW5nL3NyYy9odG1sLWJlaGF2aW9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPcmlnaW59IGZyb20gJ2F1cmVsaWEtbWV0YWRhdGEnO1xuaW1wb3J0IHtPYnNlcnZlckxvY2F0b3J9IGZyb20gJ2F1cmVsaWEtYmluZGluZyc7XG5pbXBvcnQge1Rhc2tRdWV1ZX0gZnJvbSAnYXVyZWxpYS10YXNrLXF1ZXVlJztcbmltcG9ydCB7Vmlld1N0cmF0ZWd5fSBmcm9tICcuL3ZpZXctc3RyYXRlZ3knO1xuaW1wb3J0IHtWaWV3RW5naW5lfSBmcm9tICcuL3ZpZXctZW5naW5lJztcbmltcG9ydCB7Q29udGVudFNlbGVjdG9yfSBmcm9tICcuL2NvbnRlbnQtc2VsZWN0b3InO1xuaW1wb3J0IHtoeXBoZW5hdGV9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge0JpbmRhYmxlUHJvcGVydHl9IGZyb20gJy4vYmluZGFibGUtcHJvcGVydHknO1xuaW1wb3J0IHtCZWhhdmlvckluc3RhbmNlfSBmcm9tICcuL2JlaGF2aW9yLWluc3RhbmNlJztcblxudmFyIGRlZmF1bHRJbnN0cnVjdGlvbiA9IHsgc3VwcHJlc3NCaW5kOmZhbHNlIH0sXG4gICAgY29udGVudFNlbGVjdG9yRmFjdG9yeU9wdGlvbnMgPSB7IHN1cHByZXNzQmluZDp0cnVlIH0sXG4gICAgaGFzU2hhZG93RE9NID0gISFIVE1MRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdDtcblxuZXhwb3J0IGNsYXNzIEh0bWxCZWhhdmlvclJlc291cmNlIHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLmVsZW1lbnROYW1lID0gbnVsbDtcbiAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuYXR0cmlidXRlRGVmYXVsdEJpbmRpbmdNb2RlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGlmdHNDb250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy50YXJnZXRTaGFkb3dET00gPSBmYWxzZTtcbiAgICB0aGlzLnNraXBDb250ZW50UHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIHRoaXMudXNlc1NoYWRvd0RPTSA9IGZhbHNlO1xuICAgIHRoaXMuY2hpbGRFeHByZXNzaW9uID0gbnVsbDtcbiAgICB0aGlzLmhhc0R5bmFtaWNPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5jb250YWluZXJsZXNzID0gZmFsc2U7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gW107XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gIH1cblxuICBzdGF0aWMgY29udmVudGlvbihuYW1lLCBleGlzdGluZyl7XG4gICAgdmFyIGJlaGF2aW9yO1xuXG4gICAgaWYobmFtZS5lbmRzV2l0aCgnQ3VzdG9tQXR0cmlidXRlJykpe1xuICAgICAgYmVoYXZpb3IgPSBleGlzdGluZyB8fCBuZXcgSHRtbEJlaGF2aW9yUmVzb3VyY2UoKTtcbiAgICAgIGJlaGF2aW9yLmF0dHJpYnV0ZU5hbWUgPSBoeXBoZW5hdGUobmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgtMTUpKTtcbiAgICB9XG5cbiAgICBpZihuYW1lLmVuZHNXaXRoKCdDdXN0b21FbGVtZW50Jykpe1xuICAgICAgYmVoYXZpb3IgPSBleGlzdGluZyB8fCBuZXcgSHRtbEJlaGF2aW9yUmVzb3VyY2UoKTtcbiAgICAgIGJlaGF2aW9yLmVsZW1lbnROYW1lID0gaHlwaGVuYXRlKG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoLTEzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlaGF2aW9yO1xuICB9XG5cbiAgYW5hbHl6ZShjb250YWluZXIsIHRhcmdldCl7XG4gICAgdmFyIHByb3RvID0gdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgYXR0cmlidXRlTmFtZSA9IHRoaXMuYXR0cmlidXRlTmFtZSxcbiAgICAgICAgYXR0cmlidXRlRGVmYXVsdEJpbmRpbmdNb2RlID0gdGhpcy5hdHRyaWJ1dGVEZWZhdWx0QmluZGluZ01vZGUsXG4gICAgICAgIGksIGlpLCBjdXJyZW50O1xuXG4gICAgdGhpcy5vYnNlcnZlckxvY2F0b3IgPSBjb250YWluZXIuZ2V0KE9ic2VydmVyTG9jYXRvcik7XG4gICAgdGhpcy50YXNrUXVldWUgPSBjb250YWluZXIuZ2V0KFRhc2tRdWV1ZSk7XG5cbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLnVzZXNTaGFkb3dET00gPSB0aGlzLnRhcmdldFNoYWRvd0RPTSAmJiBoYXNTaGFkb3dET007XG4gICAgdGhpcy5oYW5kbGVzQ3JlYXRlZCA9ICgnY3JlYXRlZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuaGFuZGxlc0JpbmQgPSAoJ2JpbmQnIGluIHByb3RvKTtcbiAgICB0aGlzLmhhbmRsZXNVbmJpbmQgPSAoJ3VuYmluZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuaGFuZGxlc0F0dGFjaGVkID0gKCdhdHRhY2hlZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuaGFuZGxlc0RldGFjaGVkID0gKCdkZXRhY2hlZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuYXBpTmFtZSA9ICh0aGlzLmVsZW1lbnROYW1lIHx8IHRoaXMuYXR0cmlidXRlTmFtZSkucmVwbGFjZSgvLShbYS16XSkvZywgKG0sIHcpID0+IHcudG9VcHBlckNhc2UoKSk7XG5cbiAgICBpZihhdHRyaWJ1dGVOYW1lICE9PSBudWxsKXtcbiAgICAgIGlmKHByb3BlcnRpZXMubGVuZ3RoID09PSAwKXsgLy9kZWZhdWx0IGZvciBjdXN0b20gYXR0cmlidXRlc1xuICAgICAgICBuZXcgQmluZGFibGVQcm9wZXJ0eSh7XG4gICAgICAgICAgbmFtZTondmFsdWUnLFxuICAgICAgICAgIGNoYW5nZUhhbmRsZXI6J3ZhbHVlQ2hhbmdlZCcgaW4gcHJvdG8gPyAndmFsdWVDaGFuZ2VkJyA6IG51bGwsXG4gICAgICAgICAgYXR0cmlidXRlOmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgZGVmYXVsdEJpbmRpbmdNb2RlOiBhdHRyaWJ1dGVEZWZhdWx0QmluZGluZ01vZGVcbiAgICAgICAgfSkucmVnaXN0ZXJXaXRoKHRhcmdldCwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQgPSBwcm9wZXJ0aWVzWzBdO1xuXG4gICAgICBpZihwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSAmJiBjdXJyZW50Lm5hbWUgPT09ICd2YWx1ZScpeyAvL2RlZmF1bHQgZm9yIGN1c3RvbSBhdHRyaWJ1dGVzXG4gICAgICAgIGN1cnJlbnQuaXNEeW5hbWljID0gY3VycmVudC5oYXNPcHRpb25zID0gdGhpcy5oYXNEeW5hbWljT3B0aW9ucztcbiAgICAgICAgY3VycmVudC5kZWZpbmVPbih0YXJnZXQsIHRoaXMpO1xuICAgICAgfSBlbHNleyAvL2N1c3RvbSBhdHRyaWJ1dGUgd2l0aCBvcHRpb25zXG4gICAgICAgIGZvcihpID0gMCwgaWkgPSBwcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgICAgIHByb3BlcnRpZXNbaV0uZGVmaW5lT24odGFyZ2V0LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPSBuZXcgQmluZGFibGVQcm9wZXJ0eSh7XG4gICAgICAgICAgbmFtZTondmFsdWUnLFxuICAgICAgICAgIGNoYW5nZUhhbmRsZXI6J3ZhbHVlQ2hhbmdlZCcgaW4gcHJvdG8gPyAndmFsdWVDaGFuZ2VkJyA6IG51bGwsXG4gICAgICAgICAgYXR0cmlidXRlOmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgZGVmYXVsdEJpbmRpbmdNb2RlOiBhdHRyaWJ1dGVEZWZhdWx0QmluZGluZ01vZGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3VycmVudC5oYXNPcHRpb25zID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudC5yZWdpc3RlcldpdGgodGFyZ2V0LCB0aGlzKTtcbiAgICAgIH1cbiAgICB9ZWxzZXtcbiAgICAgIGZvcihpID0gMCwgaWkgPSBwcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgICBwcm9wZXJ0aWVzW2ldLmRlZmluZU9uKHRhcmdldCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZChjb250YWluZXIsIHRhcmdldCwgdmlld1N0cmF0ZWd5LCB0cmFuc2llbnRWaWV3KXtcbiAgICB2YXIgb3B0aW9ucztcblxuICAgIGlmKHRoaXMuZWxlbWVudE5hbWUgIT09IG51bGwpe1xuICAgICAgdmlld1N0cmF0ZWd5ID0gdmlld1N0cmF0ZWd5IHx8IHRoaXMudmlld1N0cmF0ZWd5IHx8IFZpZXdTdHJhdGVneS5nZXREZWZhdWx0KHRhcmdldCk7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICB0YXJnZXRTaGFkb3dET006dGhpcy50YXJnZXRTaGFkb3dET00sXG4gICAgICAgIGJlZm9yZUNvbXBpbGU6dGFyZ2V0LmJlZm9yZUNvbXBpbGVcbiAgICAgIH07XG5cbiAgICAgIGlmKCF2aWV3U3RyYXRlZ3kubW9kdWxlSWQpe1xuICAgICAgICB2aWV3U3RyYXRlZ3kubW9kdWxlSWQgPSBPcmlnaW4uZ2V0KHRhcmdldCkubW9kdWxlSWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2aWV3U3RyYXRlZ3kubG9hZFZpZXdGYWN0b3J5KGNvbnRhaW5lci5nZXQoVmlld0VuZ2luZSksIG9wdGlvbnMpLnRoZW4odmlld0ZhY3RvcnkgPT4ge1xuICAgICAgICBpZighdHJhbnNpZW50Vmlldyl7XG4gICAgICAgICAgdGhpcy52aWV3RmFjdG9yeSA9IHZpZXdGYWN0b3J5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpZXdGYWN0b3J5O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgfVxuXG4gIHJlZ2lzdGVyKHJlZ2lzdHJ5LCBuYW1lKXtcbiAgICBpZih0aGlzLmF0dHJpYnV0ZU5hbWUgIT09IG51bGwpIHtcbiAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQXR0cmlidXRlKG5hbWUgfHwgdGhpcy5hdHRyaWJ1dGVOYW1lLCB0aGlzLCB0aGlzLmF0dHJpYnV0ZU5hbWUpO1xuICAgIH1cblxuICAgIGlmKHRoaXMuZWxlbWVudE5hbWUgIT09IG51bGwpIHtcbiAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRWxlbWVudChuYW1lIHx8IHRoaXMuZWxlbWVudE5hbWUsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGUoY29tcGlsZXIsIHJlc291cmNlcywgbm9kZSwgaW5zdHJ1Y3Rpb24sIHBhcmVudE5vZGUpe1xuICAgIGlmKHRoaXMubGlmdHNDb250ZW50KXtcbiAgICAgIGlmKCFpbnN0cnVjdGlvbi52aWV3RmFjdG9yeSl7XG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyksXG4gICAgICAgICAgICBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgICAgIHBhcnQgPSBub2RlLmdldEF0dHJpYnV0ZSgncGFydCcpO1xuXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGluc3RydWN0aW9uLm9yaWdpbmFsQXR0ck5hbWUpO1xuXG4gICAgICAgIGlmKG5vZGUucGFyZW50Tm9kZSl7XG4gICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0ZW1wbGF0ZSwgbm9kZSk7XG4gICAgICAgIH1lbHNlIGlmKHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCl7IC8vSEFDSzogSUUgdGVtcGxhdGUgZWxlbWVudCBhbmQgc2hhZG93IGRvbSBwb2x5ZmlsbHMgbm90IHF1aXRlIHJpZ2h0Li4uXG4gICAgICAgICAgU2hhZG93RE9NUG9seWZpbGwudW53cmFwKHBhcmVudE5vZGUpLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgIFNoYWRvd0RPTVBvbHlmaWxsLnVud3JhcCh0ZW1wbGF0ZSksXG4gICAgICAgICAgICBTaGFkb3dET01Qb2x5ZmlsbC51bndyYXAobm9kZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1lbHNleyAvL0hBQ0s6IHNhbWUgYXMgYWJvdmVcbiAgICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0ZW1wbGF0ZSwgbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24udmlld0ZhY3RvcnkgPSBjb21waWxlci5jb21waWxlKGZyYWdtZW50LCByZXNvdXJjZXMpO1xuXG4gICAgICAgIGlmKHBhcnQpe1xuICAgICAgICAgIGluc3RydWN0aW9uLnZpZXdGYWN0b3J5LnBhcnQgPSBwYXJ0O1xuICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdwYXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gdGVtcGxhdGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHRoaXMuZWxlbWVudE5hbWUgIT09IG51bGwpeyAvL2N1c3RvbSBlbGVtZW50XG4gICAgICB2YXIgcGFydFJlcGxhY2VtZW50cyA9IHt9O1xuXG4gICAgICBpZighdGhpcy5za2lwQ29udGVudFByb2Nlc3NpbmcgJiYgbm9kZS5oYXNDaGlsZE5vZGVzKCkpe1xuICAgICAgICBpZighdGhpcy51c2VzU2hhZG93RE9NKXtcbiAgICAgICAgICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgbmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkKSB7XG4gICAgICAgICAgICBuZXh0U2libGluZyA9IGN1cnJlbnRDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgaWYoY3VycmVudENoaWxkLnRhZ05hbWUgPT09ICdURU1QTEFURScgJiYgKHRvUmVwbGFjZSA9IGN1cnJlbnRDaGlsZC5nZXRBdHRyaWJ1dGUoJ3JlcGxhY2UtcGFydCcpKSl7XG4gICAgICAgICAgICAgIHBhcnRSZXBsYWNlbWVudHNbdG9SZXBsYWNlXSA9IGNvbXBpbGVyLmNvbXBpbGUoY3VycmVudENoaWxkLCByZXNvdXJjZXMpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGN1cnJlbnRDaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluc3RydWN0aW9uLmNvbnRlbnRGYWN0b3J5ID0gY29tcGlsZXIuY29tcGlsZShmcmFnbWVudCwgcmVzb3VyY2VzKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgdmFyIGN1cnJlbnRDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgbmV4dFNpYmxpbmcsIHRvUmVwbGFjZTtcblxuICAgICAgICAgIHdoaWxlIChjdXJyZW50Q2hpbGQpIHtcbiAgICAgICAgICAgIG5leHRTaWJsaW5nID0gY3VycmVudENoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZihjdXJyZW50Q2hpbGQudGFnTmFtZSA9PT0gJ1RFTVBMQVRFJyAmJiAodG9SZXBsYWNlID0gY3VycmVudENoaWxkLmdldEF0dHJpYnV0ZSgncmVwbGFjZS1wYXJ0JykpKXtcbiAgICAgICAgICAgICAgcGFydFJlcGxhY2VtZW50c1t0b1JlcGxhY2VdID0gY29tcGlsZXIuY29tcGlsZShjdXJyZW50Q2hpbGQsIHJlc291cmNlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RydWN0aW9uLnBhcnRSZXBsYWNlbWVudHMgPSBwYXJ0UmVwbGFjZW1lbnRzO1xuICAgIGluc3RydWN0aW9uLnN1cHByZXNzQmluZCA9IHRydWU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBjcmVhdGUoY29udGFpbmVyLCBpbnN0cnVjdGlvbj1kZWZhdWx0SW5zdHJ1Y3Rpb24sIGVsZW1lbnQ9bnVsbCwgYmluZGluZ3M9bnVsbCl7XG4gICAgdmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBpbnN0cnVjdGlvbi5leGVjdXRpb25Db250ZXh0IHx8IGNvbnRhaW5lci5nZXQodGhpcy50YXJnZXQpLFxuICAgICAgICBiZWhhdmlvckluc3RhbmNlID0gbmV3IEJlaGF2aW9ySW5zdGFuY2UodGhpcywgZXhlY3V0aW9uQ29udGV4dCwgaW5zdHJ1Y3Rpb24pLFxuICAgICAgICB2aWV3RmFjdG9yeSwgaG9zdDtcblxuICAgIGlmKHRoaXMubGlmdHNDb250ZW50KXtcbiAgICAgIC8vdGVtcGxhdGUgY29udHJvbGxlclxuICAgICAgZWxlbWVudC5wcmltYXJ5QmVoYXZpb3IgPSBiZWhhdmlvckluc3RhbmNlO1xuICAgIH0gZWxzZSBpZih0aGlzLmVsZW1lbnROYW1lICE9PSBudWxsKXtcbiAgICAgIC8vY3VzdG9tIGVsZW1lbnRcbiAgICAgIHZpZXdGYWN0b3J5ID0gaW5zdHJ1Y3Rpb24udmlld0ZhY3RvcnkgfHwgdGhpcy52aWV3RmFjdG9yeTtcblxuICAgICAgaWYodmlld0ZhY3Rvcnkpe1xuICAgICAgICAvL1RPRE86IGFwcGx5IGVsZW1lbnQgaW5zdHJ1Y3Rpb25zPyB2YXIgcmVzdWx0cyA9IHZpZXdGYWN0b3J5LmFwcGx5RWxlbWVudEluc3RydWN0aW9ucyhjb250YWluZXIsIGJlaGF2aW9ySW5zdGFuY2UuZXhlY3V0aW9uQ29udGV4dCwgZWxlbWVudCk7XG4gICAgICAgIGJlaGF2aW9ySW5zdGFuY2UudmlldyA9IHZpZXdGYWN0b3J5LmNyZWF0ZShjb250YWluZXIsIGJlaGF2aW9ySW5zdGFuY2UuZXhlY3V0aW9uQ29udGV4dCwgaW5zdHJ1Y3Rpb24pO1xuICAgICAgICAvL1RPRE86IHJlZ2lzdGVyIHJlc3VsdHMgd2l0aCB2aWV3XG4gICAgICB9XG5cbiAgICAgIGlmKGVsZW1lbnQpe1xuICAgICAgICBlbGVtZW50LnByaW1hcnlCZWhhdmlvciA9IGJlaGF2aW9ySW5zdGFuY2U7XG5cbiAgICAgICAgaWYodGhpcy51c2VzU2hhZG93RE9NKSB7XG4gICAgICAgICAgaG9zdCA9IGVsZW1lbnQuY3JlYXRlU2hhZG93Um9vdCgpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICBob3N0ID0gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGJlaGF2aW9ySW5zdGFuY2Uudmlldyl7XG4gICAgICAgICAgaWYoIXRoaXMudXNlc1NoYWRvd0RPTSkge1xuICAgICAgICAgICAgaWYoaW5zdHJ1Y3Rpb24uY29udGVudEZhY3Rvcnkpe1xuICAgICAgICAgICAgICB2YXIgY29udGVudFZpZXcgPSBpbnN0cnVjdGlvbi5jb250ZW50RmFjdG9yeS5jcmVhdGUoY29udGFpbmVyLCBudWxsLCBjb250ZW50U2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgQ29udGVudFNlbGVjdG9yLmFwcGx5U2VsZWN0b3JzKFxuICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LFxuICAgICAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5jb250ZW50U2VsZWN0b3JzLFxuICAgICAgICAgICAgICAgIChjb250ZW50U2VsZWN0b3IsIGdyb3VwKSA9PiBjb250ZW50U2VsZWN0b3IuYWRkKGdyb3VwKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2UuY29udGVudFZpZXcgPSBjb250ZW50VmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihpbnN0cnVjdGlvbi5hbmNob3JJc0NvbnRhaW5lcil7XG4gICAgICAgICAgICBpZih0aGlzLmNoaWxkRXhwcmVzc2lvbil7XG4gICAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5hZGRCaW5kaW5nKHRoaXMuY2hpbGRFeHByZXNzaW9uLmNyZWF0ZUJpbmRpbmcoaG9zdCwgYmVoYXZpb3JJbnN0YW5jZS5leGVjdXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5hcHBlbmROb2Rlc1RvKGhvc3QpO1xuICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgYmVoYXZpb3JJbnN0YW5jZS52aWV3Lmluc2VydE5vZGVzQmVmb3JlKGhvc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfWVsc2UgaWYodGhpcy5jaGlsZEV4cHJlc3Npb24pe1xuICAgICAgICAgIGJpbmRpbmdzLnB1c2godGhpcy5jaGlsZEV4cHJlc3Npb24uY3JlYXRlQmluZGluZyhlbGVtZW50LCBiZWhhdmlvckluc3RhbmNlLmV4ZWN1dGlvbkNvbnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgfWVsc2UgaWYoYmVoYXZpb3JJbnN0YW5jZS52aWV3KXtcbiAgICAgICAgLy9keW5hbWljIGVsZW1lbnQgd2l0aCB2aWV3XG4gICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5vd25lciA9IGJlaGF2aW9ySW5zdGFuY2U7XG5cbiAgICAgICAgaWYodGhpcy5jaGlsZEV4cHJlc3Npb24pe1xuICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5hZGRCaW5kaW5nKHRoaXMuY2hpbGRFeHByZXNzaW9uLmNyZWF0ZUJpbmRpbmcoaW5zdHJ1Y3Rpb24uaG9zdCwgYmVoYXZpb3JJbnN0YW5jZS5leGVjdXRpb25Db250ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgIH1lbHNlIGlmKHRoaXMuY2hpbGRFeHByZXNzaW9uKXtcbiAgICAgICAgLy9keW5hbWljIGVsZW1lbnQgd2l0aG91dCB2aWV3XG4gICAgICAgIGJpbmRpbmdzLnB1c2godGhpcy5jaGlsZEV4cHJlc3Npb24uY3JlYXRlQmluZGluZyhpbnN0cnVjdGlvbi5ob3N0LCBiZWhhdmlvckluc3RhbmNlLmV4ZWN1dGlvbkNvbnRleHQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodGhpcy5jaGlsZEV4cHJlc3Npb24pe1xuICAgICAgLy9jdXN0b20gYXR0cmlidXRlXG4gICAgICBiaW5kaW5ncy5wdXNoKHRoaXMuY2hpbGRFeHByZXNzaW9uLmNyZWF0ZUJpbmRpbmcoZWxlbWVudCwgYmVoYXZpb3JJbnN0YW5jZS5leGVjdXRpb25Db250ZXh0KSk7XG4gICAgfVxuXG4gICAgaWYoZWxlbWVudCAmJiAhKHRoaXMuYXBpTmFtZSBpbiBlbGVtZW50KSl7XG4gICAgICBlbGVtZW50W3RoaXMuYXBpTmFtZV0gPSBiZWhhdmlvckluc3RhbmNlLmV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlaGF2aW9ySW5zdGFuY2U7XG4gIH1cblxuICBlbnN1cmVQcm9wZXJ0aWVzRGVmaW5lZChpbnN0YW5jZSwgbG9va3VwKXtcbiAgICB2YXIgcHJvcGVydGllcywgaSwgaWksIG9ic2VydmVyO1xuXG4gICAgaWYoJ19fcHJvcGVydGllc0RlZmluZWRfXycgaW4gbG9va3VwKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb29rdXAuX19wcm9wZXJ0aWVzRGVmaW5lZF9fID0gdHJ1ZTtcbiAgICBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzO1xuXG4gICAgZm9yKGkgPSAwLCBpaSA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBvYnNlcnZlciA9IHByb3BlcnRpZXNbaV0uY3JlYXRlT2JzZXJ2ZXIoaW5zdGFuY2UpO1xuXG4gICAgICBpZihvYnNlcnZlciAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgbG9va3VwW29ic2VydmVyLnByb3BlcnR5TmFtZV0gPSBvYnNlcnZlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ== |